//package org.ricks.net.consumer;
//
//import org.ricks.common.lang.Logger;
//import org.ricks.net.balancer.IConsumerLoadBalancer;
//
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * 游戏服定制策略，玩家登录 游戏服缓存玩家数据，直至玩家退出游戏 销毁内存数据。这期间玩家都再此游戏服节点处理业务逻辑
// *
// * 以玩家在线人数 分配节点
// *
// * 其实简单 可以使用hash一致性算法，也能保障节点分配均匀
// */
//public class UserOnlineCountLoadBalancer implements IConsumerLoadBalancer {
//
//    /**
//     * 每个游戏节点 玩家在线总人数
//     * key:游戏服Id  value:游戏服在线总人数
//     */
//    private Map<AioSession,Integer> userOnlineCounts = new ConcurrentHashMap<>();
//
//
//    /**
//     * game节点 总在线人数同步
//     * 一般用于定时同步
//     * @param session game session
//     * @param userOnlineCount
//     */
//    public synchronized void changeUserOnlineCount(AioSession session, int userOnlineCount) {
//        userOnlineCounts.put(session,userOnlineCount);
//    }
//
//    /**
//     * 玩家进入游戏，改变游戏服在线人数统计
//     * @param session
//     */
//    public synchronized void userIntoGame (AioSession session) {
//        int gameUserOnlineCount = userOnlineCounts.computeIfAbsent(session,k-> 0);
//        userOnlineCounts.put(session,++gameUserOnlineCount);
//    }
//
//    /**
//     * 玩家退出游戏，改变游戏服在线人数统计
//     * @param session
//     */
//    public synchronized void userQuitGame(AioSession session) {
//        int gameUserOnlineCount = userOnlineCounts.getOrDefault(session,0);
//        try {
//            String hostName = session.getRemoteAddress().getHostString();
//            if(gameUserOnlineCount <= 0) {
//                Logger.warn("Game host:" + hostName + " 在线人数统计异常，请检测 ");
//                return;
//            }
//            userOnlineCounts.put(session, --gameUserOnlineCount);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    /**
//     * 游戏服关闭
//     * @param gameId
//     */
//    public synchronized void removeUserOnlineCount(short gameId) {
//        userOnlineCounts.remove(gameId);
//    }
//
//    /**
//     * 游戏服启动
//     * @param session
//     */
//    public synchronized void initUserOnlineCount(AioSession session) {
//        userOnlineCounts.put(session, 0);
//    }
//
//    /**
//     * 在线人数策略分配logicSession后，由业务层面驱动绑定UserSession中
//     * @param modularId
//     * @param argument 计算参数
//     * @return
//     */
//    @Override
//    public AioSession loadBalancer(byte modularId,  Object argument) {
//
////        if(userOnlineCounts.isEmpty()) {
////             return ConsistentHashConsumerLoadBalancer.getInstance().loadBalancer(modularId,argument);
////        }
//        //节点未进行强绑定，或则节点故障。开始重新分配节点
//        List<Map.Entry<AioSession,Integer>> list = new ArrayList<>(userOnlineCounts.entrySet());
//        list.sort((o1, o2) -> o1.getValue() - o2.getValue());
//        return list.getFirst().getKey();
//    }
//}
